import logging
import os
from logging.handlers import RotatingFileHandler
from conf.config import settings

def setup_logger(name='app', log_dir='logs', level=logging.INFO):
    """
    设置日志记录器
    
    Args:
        name: 日志记录器名称
        log_dir: 日志文件存储目录 
        level: 日志级别
    
    Returns:
        logger: 配置好的日志记录器实例
    """
    # 创建日志目录
    if not os.path.exists(log_dir):
        os.makedirs(log_dir)
        
    # 创建日志记录器
    logger = logging.getLogger(name)
    logger.setLevel(level)
    
    # 日志格式
    formatter = logging.Formatter(
        '%(asctime)s - %(levelname)s - %(message)s'
    )
    
    # 控制台处理器
    console_handler = logging.StreamHandler()
    console_handler.setFormatter(formatter)
    logger.addHandler(console_handler)
    
    # 文件处理器(支持日志轮转)
    file_handler = RotatingFileHandler(
        os.path.join(log_dir, f'{name}.log'),
        maxBytes=10*1024*1024,  # 10MB
        backupCount=5,
        encoding='utf-8'
    )
    file_handler.setFormatter(formatter)
    logger.addHandler(file_handler)
    
    return logger

# 创建默认日志记录器实例
log_algo = setup_logger(
        name="texttransfer", 
        log_dir=settings.LOG_ALGO_CONFIG['LOG_DIR'], 
        level=settings.LOG_ALGO_CONFIG['LOG_LEVEL']
    )

log_adapter = setup_logger(
        name="adapter", 
        log_dir=settings.LOG_ADAPTER_CONFIG['LOG_DIR'], 
        level=settings.LOG_ADAPTER_CONFIG['LOG_LEVEL']
    )

def log_method_io(func):
    """
    装饰器: 记录方法的执行开始、结束和输出,支持同步和异步方法
    
    Args:
        func: 被装饰的函数
    """
    import functools
    import inspect
    
    def log_execution(name, result):
        """记录执行结果的内部函数"""
        log_algo.info(f"方法 {name} 执行完成")
        result_len = len(result) if isinstance(result, (dict, list)) else result
        log_algo.info(f"方法 {name} 返回结果: {result_len}")
    
    @functools.wraps(func)
    def sync_wrapper(*args, **kwargs):
        log_algo.info(f"开始执行方法: {func.__name__}")
        result = func(*args, **kwargs)
        log_execution(func.__name__, result)
        return result

    @functools.wraps(func)  
    async def async_wrapper(*args, **kwargs):
        log_algo.info(f"开始执行方法: {func.__name__}")
        result = await func(*args, **kwargs)
        log_execution(func.__name__, result)
        return result

    return async_wrapper if inspect.iscoroutinefunction(func) else sync_wrapper

def log_adapter_chat_io(func):
    """
    装饰器: 记录适配器方法的执行开始、结束和输出
    
    Args:
        func: 被装饰的函数
    """
    def wrapper(*args, **kwargs):
        # 记录开始执行和输入参数
        llm_input = {}
        llm_input['messages'] = kwargs.get('messages', '')
        log_adapter.info(f"[{func.__name__}: start]")
        # 执行方法
        result = func(*args, **kwargs)
        # 记录执行结果
        status = "success" if result is not None else "failed"
        log_adapter.info(f"[{func.__name__}: {status}]\n[input: {llm_input}]\n[output: {result}]")
        
        return result
        
    return wrapper

